/**
 * 项目名称:
 *
 * @Author: 夏国倩
 * @Date: 2023/10/14 14:39
 * @Copyright
 */
package Reflect;

import java.lang.reflect.Field;

/*
必须掌握：怎么通过反射机制访问一个Java对象的属性
         给属性赋值set
         获取属性的值get
 */
public class ReflectTest7 {
    public static void main(String[] args) throws Exception{
        //我们不适用反射机制，怎么去访问一个对象的属性呢？
        Student s=new Student();
        //给属性赋值
        s.no=1111;
        //三要素：给s对象的no属性赋值1111
        //要素1：对象s
        //要素2：no属性
        //要素3：1111

        //读属性值
        //两个要素：获取s对象的no属性值
        System.out.println(s.no);

        //使用反射机制，怎么去访问一个对象的属性（set get）
        Class studentClass=Class.forName("demo.Reflect.Student");
        Object obj=studentClass.newInstance(); //obj就是Student对象（底层调用无参构造方法）

        //获取no属性（根据属性的名称来获取Field）
        Field noField=studentClass.getDeclaredField("no");

        //给obj对象（Student）的no属性赋值
        noField.set(obj,2222); //给obj对象的no属性赋值2222

        //读取属性的值
        //两个要素：获取obj对象的no 属性的值
        System.out.println(noField.get(obj));

        //可以访问私有属性
        Field nameField = studentClass.getDeclaredField("name");

        //打破封装(反射机制的缺点：打破封装，可能会给不法分子留下机会)
        nameField.setAccessible(true);

        //给name属性赋值
        nameField.set(obj,"张三");
        //获取name属性的值
        System.out.println(nameField.get(obj));
    }
}
